package com.collabscm.waf.domain.service;

import java.io.Serializable;

import org.springframework.transaction.annotation.Transactional;

import com.collabscm.waf.app.service.ApplicationService;

/**
 * DomainService是一种特殊的ApplicationService，是仅提供对一个Domain Object的服务。
 * 此为系统定义的Domain的业务逻辑部分的抽象，要求每个业务Service必须提供的逻辑部分。
 * 另外注意：此处命名为DomainService，就代表着此为
 * 
 * @author Zeng Raoxing
 */
public interface DomainService<T, PK extends Serializable> extends ApplicationService {

    /** 
     * 创建一个新的实体对象，并将其持久化到数据库中。 
     */
	@Transactional
    void create(T entity);

    /** 
     * 根据主键得到一个实体对象
     */
	@Transactional(readOnly=true)
    T find(PK id);

    /** 
     * 更新实体对象
     */
    @Transactional
    void update(T entity);

    /** 
     * 删除实体对象 
     */
    @Transactional
    void delete(T entity);
    
    /**
     * 根据主键删除对象
     * 
     * @param id 业务主键
     */
    @Transactional
    void deleteById(PK id);
    
}
